//metoro: http://gaussianos.com/algoritmos-para-el-calculo-de-pi/
//manual func. gmp http://gmplib.org/manual/index.html#Top
//ao compilar usar -lgmp (linka gmp) e -lm (linca math)
#include<stdio.h>
#include<gmp.h>
#include<stdlib.h>

int main(void)
{	//declaraçoẽs
	mpf_t a,b,t,p,aux_gmp,pi;
	int i;
	FILE *f;
	
	
	//alocacao na mem.
	mpf_init(a);
	mpf_init(b);
	mpf_init(t);
	mpf_init(p);
	mpf_init(aux_gmp);
	mpf_init(pi);
	mpf_set_prec (a ,33300000);//reserva um numero de 1428554 bits para a.
	mpf_set_prec (b ,33300000);
	mpf_set_prec (t ,33300000);
	mpf_set_prec (p ,33300000);
	mpf_set_prec (aux_gmp ,33300000);//n*log10base2
	mpf_set_prec (pi ,33300000);
	//inicialização da variavel
	mpf_set_d(a,1.0);
	mpf_set_d(b,1.0);
	mpf_set_d(aux_gmp,2.0);
	mpf_sqrt(aux_gmp,aux_gmp);
	mpf_div(b,b,aux_gmp);
	mpf_set_d(t,1.0);
	mpf_set_d(aux_gmp,4.0);
	mpf_div(t,t,aux_gmp);
	mpf_set_d(p,1.0);

		//interações
	for(i=0; i<23; i++) //-- 2^n=1000000 (dobra o numero de casa por interação) -> 23 inteirações.
	{
		 //primeiro bloco de operações (calculoo do pi)
		 mpf_add(pi,a,b);
		 mpf_pow_ui(pi,pi,2);
		 mpf_div_ui(pi,pi,4);
		 mpf_div(pi,pi,t);//pi=((a(n)+b(n))^2)/(4*t(n))

		 //segundo bloco de operações (para prox. interação)
		 mpf_set(aux_gmp,a);// aux_gmp=a, para usar depois 
		 mpf_add(a,a,b);
		 mpf_div_ui(a,a,2); //(a(n+1)=a(n)+b(n))/2

		 //terceiro bloco 
		 mpf_mul(b,aux_gmp,b);
		 mpf_sqrt(b,b);	// b(n+1)=sqrt(a(n)*b(n))

		 //quarto bloco de interações 
		 mpf_sub(aux_gmp,aux_gmp,a);
		 mpf_pow_ui(aux_gmp,aux_gmp,2);
		 mpf_mul(aux_gmp,p,aux_gmp);
		 mpf_sub(t,t,aux_gmp);//t(n+1)=t(n) - p(n)*(a(n)-a(n+1))^2

		 //quinto bloco de operação
		 mpf_mul_ui(p,p,2);//p(n+1)=p(n)*2
	}
	
	f=fopen("saida.txt","w");
	gmp_fprintf (f, "%.10000000Ff\n",pi);
	//gmp_printf("%F1.50f\n", pi);
	fclose(f);
	return 0;
}
